package dr.ihm;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;


import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JEditorPane;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import data.Game;
import dr.moteur.GameEngine;
import dr.reseau.ClientReseau;
/**
 * Cette classe represente l interface de creation de partie. Elle contient tous les elements permettant de creer cette fenetre et tous les elements gerant les interactions IHM
 *
 */
public class F_Start implements MouseListener,ItemListener {

	private static final long serialVersionUID = 1L;
	/**
	 * titre de la fenetre
	 */
	public String title;
	/**
	 * 
	 */
	public BarreDeMenu barreDeMenu;
	/**
	 * conteneur permettant de ranger les informations relatives au mode de jeu
	 */
	public JPanel mode;
	/**
	 * radio bouton permettant de selectionner le mode de jeu facile
	 */
	private JRadioButton modeF;
	/**
	 * radio bouton permettant de selectionner le mode de jeu normal
	 */
	private JRadioButton modeN;
	/**
	 * radio bouton permettant de selectionner le mode de jeu difficile
	 */
	private JRadioButton modeD;
	/**
	 * conteneur permettant de ranger les informations relatives a l'utilisateur
	 */
	public JPanel joueur;
	/**
	 * conteneur permettant de ranger les informations relatives au terrain
	 */
	public JPanel terrain;
	/**
	 * conteneur permettant de ranger les informations relatives aux joueurs connectes
	 */
	public JPanel adversaires;
	/**
	 * 
	 */
	public JEditorPane base;
	/**
	 * grille permettant de positionner les differents composants dans la fenetre
	 */
	public GridBagLayout grille;
	/**
	 * fenetre 
	 */
	public JFrame frame;
    /**
     * taille de la fenetre
     */
    public int w_frame, h_frame;
    /**
     * variable permettant de stocker le choix du joueur quant a la somme de depart (en fonction du mode)
     */
    private int argent_init;

    /**
     * boite de dialogue parcourir permettant a l utilisateur de joueur sur sa propre carte
     */
    private JFileChooser choix = new JFileChooser();
    /**
     * choix du joueur quant a sa participation au cours de la prochaine partie
     */
    private boolean status_obs;
    /**
     * chemin vers le fichier xml permettant de mettre en place le jeu
     */
    private String fichier_config ;
    /**
     * pseudo du joueur
     */
    private String nom_joueur;
    /**
     * case a cocher permettant d indiquer si l utilisateur veut joueur ou observer une partie
     */
    private JCheckBox observateur;

    /**
     * case a cocher permettant d'inviter des joueurs
     */
    private JCheckBox adversaires1;

	
    /**
	 * 
	 * Constructeur de la fenetre de creation de partie. 
	 * 
	 * @param GE reference du moteur graphque
	 * @param window conteneur 
	 * @param width taille
	 * @param height taille 
	 * @param barreDeMenu objet representant la barre de menu
	 */
	public F_Start(GameEngine GE, Window window, int width, int height, BarreDeMenu barreDeMenu){
		
		fichier_config = "map/config_carte1.xml";
		frame = new JFrame(); 
		
		this.barreDeMenu = barreDeMenu;
		//Ecouteurs des sous-items du menu
		this.barreDeMenu.about.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				
				//Juste OK (pour le � propos)
				
				JOptionPane.showMessageDialog(frame,"Desert Rush est un jeu issu d'un projet etudiant de 2e annee d'ecole d'ingenieur IMAC.\nIl a ete developpe dans le cadre de la validation des cours de Java et Programmation Reseau de Messieurs RAYNAL et HERUBEL\n par CIAUDO David, PAPILLON Malika, POUENAT Claire, RICHIER Marlene, TARIZZO Gregoire\nCopyright 2009");
			}
			});
		
		this.barreDeMenu.nouveau.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				
				Window.set_start_ihm();
			}
			});
		
		this.barreDeMenu.quitter.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
					//frame.setVisible(false);
					//f_jeu.getFrame().setVisible(false);
					//temps = 0;
					//tps.setText("Temps : "+temps);
					System.exit(0);
			}
			});
		
		
		Toolkit t = frame.getToolkit();
		Dimension d = t.getScreenSize();
		w_frame = d.width;
		h_frame = d.height;
		if (w_frame > width)
			w_frame = width;
		if (h_frame > height)
			h_frame = height;//En pratique celui-ci ne servira a rien je pense
		
		frame.setSize(w_frame, h_frame);
		frame.setTitle("DESERT RUSH - Commencer une partie ");
		
		mode = new JPanel();
		joueur = new JPanel();
		terrain = new JPanel();
		adversaires = new JPanel();
		
		
		////////////////////////MODES
		GridLayout gridMode = new GridLayout(3,0);
		ButtonGroup modeJeu = new ButtonGroup();
		modeF = new JRadioButton("Mode facile    ( 1000 d'or )");
		modeN = new JRadioButton("Mode moyen   ( 750 d'or )", true);
		modeD = new JRadioButton("Mode difficile ( 500 d'or )");
		modeJeu.add(modeF);
		modeJeu.add(modeN);
		modeJeu.add(modeD);
		
		mode.add(modeF); 
		mode.add(modeN);
		mode.add(modeD);
		FlowLayout fmode1 = new FlowLayout(FlowLayout.LEFT);
		FlowLayout fmode2 = new FlowLayout(FlowLayout.LEFT);
		FlowLayout fmode3 = new FlowLayout(FlowLayout.LEFT);
		modeF.setLayout(fmode1);
		modeN.setLayout(fmode2);
		modeD.setLayout(fmode3);
		mode.setLayout(gridMode);
		
		//////////////////////////////////////// JOUEURS
		GridLayout gridJoueur = new GridLayout(4,1);
		final JTextField joueur1 = new JTextField("Vous");
					joueur1.addKeyListener(new KeyListener () {

			public void keyPressed(KeyEvent k) {
				// TODO Auto-generated method stub
				if (k.getKeyCode()== KeyEvent.VK_ENTER){
					nom_joueur = joueur1.getText();
				}
			}

			public void keyReleased(KeyEvent k) {
				// TODO Auto-generated method stub
				
			}

			public void keyTyped(KeyEvent k) {
				// TODO Auto-generated method stub
				
			}

		
			
			
		} );
		
		//JTextField joueur2 = new JTextField("Joueur2");
		//JTextField joueur3 = new JTextField("Joueur3");
		//JTextField joueur4 = new JTextField("Joueur4");
		observateur = new JCheckBox("Observateur");
		joueur.add(joueur1);
		joueur.add(observateur);
		
		//joueur.add(joueur2);
		//joueur.add(joueur3);
		//joueur.add(joueur4);
		FlowLayout fjoueur1 = new FlowLayout(FlowLayout.LEFT);
		//FlowLayout fjoueur2 = new FlowLayout(FlowLayout.LEFT);
		FlowLayout fobs = new FlowLayout(FlowLayout.RIGHT);
		//FlowLayout fjoueur3 = new FlowLayout(FlowLayout.LEFT);
		//FlowLayout fjoueur4 = new FlowLayout(FlowLayout.LEFT);
		joueur1.setLayout(fjoueur1);
		observateur.setLayout(fobs);
		//joueur2.setLayout(fjoueur2);
		//joueur3.setLayout(fjoueur3);
		//joueur4.setLayout(fjoueur4);
		joueur.setLayout(gridJoueur);
		
		
		
		////////////////////////////////////////TERRAINS
		GridLayout gridTerrain = new GridLayout(3,0);
		
		final File[] fichiers = recup_fichiers ();
		final JList liste = new JList(fichiers);
		liste.setFixedCellHeight(15);
		liste.setFixedCellWidth(100);
		liste.setSelectedIndex(0);
		Object fichier = liste.getSelectedValue();
		fichier_config = ((File) fichier).getPath();
		
		liste.addListSelectionListener( new ListSelectionListener() {
			public void valueChanged(ListSelectionEvent e) {
				// TODO Auto-generated method stub
				Object fichier = liste.getSelectedValue();
				fichier_config = ((File) fichier).getPath();
			}	
		}
		);
		JButton parcourir = new JButton("Parcourir ...");
		JButton aleatoire = new JButton("Aleatoire");
		choix.setAcceptAllFileFilterUsed(false);
		choix.setDialogType(JFileChooser.OPEN_DIALOG );
		choix.setDialogTitle("Choisissez un fichier de configuration (.xml)");
		
		parcourir.addActionListener( new ActionListener() {	
			
			public void actionPerformed(ActionEvent e) {
			choix.showOpenDialog(null); //affiche la boite de dialogue
				if (choix.showOpenDialog(null) == JFileChooser.APPROVE_OPTION){	
					//status.setText(choix.getSelectedFile().getAbsolutePath()); //si un fichier est selectionné, récupérer le fichier puis sont path et l'afficher dans le champs de texte
				}
			}
			
		});
		aleatoire.addActionListener( new ActionListener() {	
			
			public void actionPerformed(ActionEvent e) {
				int max = fichiers.length-1;
				double alea = Math.random()*max;
			//	System.out.println(Math.round(alea));
				fichier_config = fichiers[(int) Math.round(alea)].getPath();
			}
		});
		
	

		FlowLayout faleatoire = new FlowLayout(FlowLayout.LEFT);
		parcourir.setLayout(faleatoire);
		FlowLayout fparcourir = new FlowLayout(FlowLayout.RIGHT);
		parcourir.setLayout(fparcourir);
		terrain.add(liste);
		terrain.add(aleatoire);
		terrain.add(parcourir);
		///terrain.add(nb_joueur);
		//FlowLayout fterrain1 = new FlowLayout(FlowLayout.LEFT);
		//FlowLayout fterrain2 = new FlowLayout(FlowLayout.LEFT);
		//FlowLayout fterrain3 = new FlowLayout(FlowLayout.LEFT);
		//FlowLayout fterrain4 = new FlowLayout(FlowLayout.RIGHT);
	//	terrain1.setLayout(fterrain1);
//		terrain2.setLayout(fterrain2);
	//	terrain3.setLayout(fterrain3);
//		terrain3.setLayout(fterrain4);
		
		terrain.setLayout(gridTerrain);
		
		
		GridLayout gridAdversaires = new GridLayout(2,0);
		adversaires1 = new JCheckBox("Inviter un joueur sur le reseau");
		adversaires1.addItemListener(this);

		
		JButton valid = new JButton("Jouer");
		
		
		//getSelected() permet de recuperer quel bouton est selectionne
		
		grille = new GridBagLayout();
		GridBagConstraints gba = new GridBagConstraints();
		GridBagConstraints gbb = new GridBagConstraints();
		GridBagConstraints gbc = new GridBagConstraints();
		GridBagConstraints gbd = new GridBagConstraints();
		frame.setLayout(grille);
		
		gba.fill = GridBagConstraints.NONE;
		gba.gridx = 0;
		gba.gridy = 0;
		gba.ipady = 0;
		gba.ipadx = 0;
		gba.weightx = 0.5;
		gba.weighty = 0.5;
		//gba.anchor = GridBagConstraints.CENTER;
		gbb.gridx = 0;
		gbb.gridy = 1;
		gbb.weightx = 0.5;
		gbb.weighty = 0.5;
		gbc.gridx = 1;
		gbc.gridy = 0;
		gbc.ipady = 40;
		gbc.ipadx = 20;
		gbc.weightx = 0.5;
		gbc.weighty = 0.5;
		gbd.gridx = 1;
		gbd.gridy = 1;
		gbd.fill = GridBagConstraints.NONE;
		gbd.anchor = GridBagConstraints.CENTER;
		gbd.weightx = 0.5;
		gbd.weighty = 0.5;
		//gbd.weighty = 0;
		grille.setConstraints(mode,gba);
		grille.setConstraints(joueur,gbb);
		grille.setConstraints(terrain,gbc);
		grille.setConstraints(adversaires,gbd);
		
		
		
	
		
		
		adversaires.add(adversaires1);
		adversaires.add(valid);		
		FlowLayout fadversaires1 = new FlowLayout(FlowLayout.LEFT);
		FlowLayout fadversaires2 = new FlowLayout(FlowLayout.LEFT);
		adversaires1.setLayout(fadversaires1);
		valid.setLayout(fadversaires2);
		adversaires.setLayout(gridAdversaires);
		
		frame.getContentPane().add(mode);
		frame.getContentPane().add(joueur);
		frame.getContentPane().add(terrain);
		frame.getContentPane().add(adversaires);
		
		frame.setJMenuBar(barreDeMenu);
		
		valid.addActionListener(new ActionListener(){
			/* (non-Javadoc)
			 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
			 */
			public void actionPerformed(ActionEvent e){
				
				int n = JOptionPane.showConfirmDialog(
                        frame, "Etes vous sur de vouloir lancer cette partie?",
                        "Jouer",
                        JOptionPane.YES_NO_OPTION);
                if (n == JOptionPane.YES_OPTION) {
    				//enregistre les données
    				if (modeF.isSelected()) argent_init = 1000;
    				else if (modeN.isSelected()) argent_init = 750;
    				else argent_init = 500;
    				
    				System.out.println("argent "+argent_init);
    				
    				// permet de passer a l'écran suivant
    				ClientReseau.jouer = true;
                } else if (n == JOptionPane.NO_OPTION) {
                    
                }
				

				System.out.println("argent "+argent_init);
				
				if (observateur.isSelected()) status_obs = true;
				
				nom_joueur = joueur1.getText();
				
				// permet de passer a l'écran suivant
				ClientReseau.jouer = true;

			}
			});
		
		
		
		
	}
	

	/**
	 * @return le pseudo saisit par le joueur
	 */
	public String getNom_joueur() {
		return nom_joueur;
	}


	/**
	 * @return le chemin vers le fichier de configuration
	 */
	public String getCarte() {
		return fichier_config;
	}

	/**
	 * @return le choix du joueur quant a son action au cours de la partie
	 */
	public boolean isStatus_obs() {
		return status_obs;
	}

	/**
	 * cette fonction permet de chercher dans le repertoire map tous les fichiers de configuration (.xml) en eliminant les autres fichiers
	 * 
	 * @return tableau contenant tous les fichiers de configuration trouves dans le repertoire map
	 */
	private File[] recup_fichiers (){

		File[] fichiers = new File[10];
		File rep = new File ("map");
		File[] files = rep.listFiles();
		String s;
		int j = 0;
		int i = 0 ;
		while (i<files.length && j<10 ){
		
			//System.out.println(i);
			s = files[i].getPath();
			//System.out.println(s);
			String[] ext = s.split(".x");
			//System.out.println(ext.length);
			if (ext.length >1){
				//System.out.println(ext[1]);
				if (ext[1].equalsIgnoreCase("ml")){
					fichiers[j]=files[i];
					j++;
					//System.out.println("yeah");
				}
			}
			i++;
		}
		//System.out.println(fichiers[0]);
		File[] fichiers_xml = new File[j];
		for (i = 0; i< j ; i++){
			fichiers_xml[i] = fichiers[i];
		}
		//System.exit(0);
		return fichiers_xml;
	}
	
	

	public void send(String s){
		System.out.println("Envoi d'un invitation a : ");
		System.out.println(s);
		
	}
	
	public void receive(){
		
		Object[] options = {"Accepter",
        "Refuser"};
int n = JOptionPane.showOptionDialog(frame,
"Vous avez ete invite par JoueurX. Souhaitez-vous rejoindre sa partie?",
"Invitation",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,     //do not use a custom Icon
options,  //the titles of buttons
options[0]); //default button title
		
if (n == JOptionPane.YES_OPTION) {
	//enregistre les données
	if (modeF.isSelected()) argent_init = 1000;
	else if (modeN.isSelected()) argent_init = 750;
	else argent_init = 500;
	
	System.out.println("argent "+argent_init);
	
	// permet de passer a l'écran suivant
	Game.jouer = true;
} else if (n == JOptionPane.NO_OPTION) {
    
}

	}
	

	/**
	 * permet de masquer la fenetre
	 */
	public JFrame getFrame() {
		return frame;
	}
	/**
	 * permet de masquer la fenetre
	 */
	public void setUnVisible(){
		
		frame.setVisible(false);
		
	}
	/**
	 * permet d afficher la fenetre 
	 */
	public void setVisible(){
		
		frame.setVisible(true);
		
	}

	/**
	 * @return montant d or attribue au joueur au debut de la partie en fonction du mode de jeu choisi
	 */
	public int getArgent_init() {
		return argent_init;
	}



	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
	
	public void itemStateChanged(ItemEvent e) {
		// TODO Auto-generated method stub
		 Object source = e.getItemSelectable();

		    if (source == adversaires1) {

		    	Object[] possibilities = {"Joueur1", "Joueur2", "Joueur3"};
		    	String s = (String) JOptionPane.showInputDialog(frame,"Choisissez un joueur a inviter : ",
		    	                    "Inviter un joueur",
		    	                    JOptionPane.PLAIN_MESSAGE,
		    	                    null,
		    	                    possibilities,
		    	                    "Joueur1");
		    	if ((s != null) && (s.length() > 0)) {
		    	   send(s);
		    		//receive();
		    	    return;
		    	}
		    	
		    	
		    	
		    	
		    } 
		    
	}	
	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Game.main(null);
	}



	

}
